package cn.jxau.common.util;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.log4j.Logger;

import java.io.IOException;

/**
 *
 * ObjectMapper是JSON操作的核心，Jackson的所有JSON操作都是在ObjectMapper中实现。
 * ObjectMapper有多个JSON序列化的方法，可以把JSON字符串保存File、OutputStream等不同的介质中。
 * writeValue(File arg0, Object arg1)把arg1转成json序列，并保存到arg0文件中。
 * writeValue(OutputStream arg0, Object arg1)把arg1转成json序列，并保存到arg0输出流中。
 * writeValueAsBytes(Object arg0)把arg0转成json序列，并把结果输出成字节数组。
 * writeValueAsString(Object arg0)把arg0转成json序列，并把结果输出成字符串。
 *
 * 该工具类依赖于jackson工具包，用于快速对java bean和json数据之间的的转化
 * Created by licho on 2017/8/18 0018.
 */
public class JacksonUtils {
    private static  final Logger log= Logger.getLogger(JacksonUtils.class);
    /**
     * 完成bean到json数据之间的转化
     * @param vo 要转化成Json的对象
     * @return
     */
    public static String converToJson(Object vo){
        ObjectMapper map=new ObjectMapper();//进项转化的map对象
        String result=null;
        try {
            result=map.writeValueAsString(vo);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 将json字符串转化为Bean对象
     * @param type  Bean的class类型
     * @param json  Bean对象对应的json字符串
     * @param <T>   class对应的具体实例对象
     * @return
     */
    public static <T> T converToBean(Class<T> type,String json){
        T vo=null;
        ObjectMapper map=new ObjectMapper();
        try {
            vo = map.readValue(json, type);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return vo;
    }

    /**
     * 美化json
     * @param json  原始json
     * @return
     */
    public static String beautifyJson(String json){
        ObjectMapper mapper=new ObjectMapper();
        Object vo = null;
        String result=null;
        try {
            vo = mapper.readValue(json,Object.class);
            result=mapper.writerWithDefaultPrettyPrinter().writeValueAsString(vo);
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println(result);
        return result;
    }
}
